package ym.controller.front.user;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import ym.pojo.User;
import ym.service.MessageService;
import ym.service.UserService;
import ym.utils.RandomUtil;
import ym.vo.BaseResult;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 用户接口
 */
@RestController
@CrossOrigin
@RequestMapping("/front/user")
public class FrontUserCon {
    @Autowired
    private UserService userService;
    @Autowired
    private MessageService messageService;

    /**
     * 新增用户
     *
     * @param user
     * @return
     */
    @PostMapping("/add")
    public BaseResult add(User user) {
        userService.add(user);
        return BaseResult.ok();
    }

    /**
     * 修改用户
     *
     * @param user
     * @return
     */
    @PostMapping("/update")
    public BaseResult update(User user) {
        userService.update(user);
        return BaseResult.ok();
    }

    /**
     * 删除用户
     *
     * @param userId
     * @return
     */
    @DeleteMapping("/delete")
    public BaseResult delete(Integer userId) {
        userService.delete(userId);
        return BaseResult.ok();
    }

    /**
     * 根据id查询用户
     *
     * @param userId
     * @return
     */
    @GetMapping("/findById")
    public BaseResult findById(Integer userId) {
        User user = userService.findById(userId);
        return BaseResult.ok(user);
    }

    /**
     * 查询所有用户
     *
     * @return
     */
    @GetMapping("/findAll")
    public BaseResult findAll() {
        List<User> all = userService.findAll();
        return BaseResult.ok(all);
    }

    /**
     * 分页查询用户
     *
     * @param page
     * @param size
     * @return
     */

    @GetMapping("/search")
    public BaseResult search(int page, int size) {
        Page<User> brandPage = userService.search(page, size);
        return BaseResult.ok(brandPage);
    }


    /**
     * 发送注册短信
     *
     * @param phone 注册手机号
     * @return
     */
    @GetMapping("/sendMessage")
    public BaseResult sendMessage(String phone) {
        // 1.生成随机四位数
        String checkCode = RandomUtil.buildCheckCode(4);
        // 2.发送短信
        BaseResult result = messageService.sendMessage(phone, checkCode);
        // 3.发送成功，将验证码保存到redis中,发送失败，返回发送结果
        if (200 == result.getCode()) {
            userService.saveRegisterCheckCode(phone, checkCode);
            return BaseResult.ok();
        } else {
            return result;
        }
    }

    /**
     * 验证用户注册验证码
     *
     * @param phone     手机号
     * @param checkCode 验证码
     * @return
     */
    @GetMapping("/registerCheckCode")
    public BaseResult register(String phone, String checkCode) {
        userService.registerCheckCode(phone, checkCode);
        return BaseResult.ok();
    }

    /**
     * 注册用户
     *
     * @param user 用户信息
     * @return
     */
    @PostMapping("/register")
    public BaseResult register(User user) {
        userService.register(user);
        return BaseResult.ok();
    }


    /**
     * 发送登录短信
     *
     * @param phone 手机号
     * @return 验证码
     */
    @GetMapping("/sendLoginCheckCode")
    public BaseResult sendLoginCheckCode(String phone) {
        // 1.生成随机四位数
        String checkCode = RandomUtil.buildCheckCode(4);
        // 2.发送短信
        BaseResult result = messageService.sendMessage(phone, checkCode);
        // 3.发送成功，将验证码保存到redis中,发送失败，返回发送结果
        if (200 == result.getCode()) {
            userService.saveLoginCheckCode(phone, checkCode);
            return BaseResult.ok();
        } else {
            return result;
        }
    }

    /**
     * 手机号验证码登录
     *
     * @param phone     手机号
     * @param checkCode 验证码
     * @return token
     */
    @PostMapping("/loginCheckCode")
    public BaseResult loginCheckCode(String phone, String checkCode) {
        String token = userService.loginCheckCode(phone, checkCode);
        return BaseResult.ok(token);
    }

    /**
     * 用户名密码登录
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/loginPassword")
    public BaseResult loginPassword(String username, String password) {
        String token = userService.loginPassword(username, password);
        return BaseResult.ok(token);
    }

    /**
     * 根据token获取登录用户
     *
     * @param token 令牌
     * @return 用户
     */
    @GetMapping("/getUser")
    public BaseResult getUser(String token) {
        User u = userService.getLoginUser(token);
        return BaseResult.ok(u);
    }

    /**
     * 根据用户名查询用户
     *
     * @param username
     * @return
     */
    @GetMapping("/findByUserName")
    public BaseResult findByUserName(String username) {
        User u = userService.findUserByUserName(username);
        return BaseResult.ok(u);
    }


    /**
     * 修改用户头像
     *
     * @param userId
     * @param userImg
     * @return
     */
    @PostMapping("/updateUserImg")
    public BaseResult updateUserImg(Integer userId, String userImg) {
        User user = userService.findById(userId);
        user.setUserImg(userImg);
        userService.update(user);
        return BaseResult.ok();
    }

    /**
     * 修改用户昵称
     *
     * @param userId
     * @param nickname
     * @return
     */
    @PostMapping("/updateNickname")
    public BaseResult updateNickname(Integer userId, String nickname) {
        User user = userService.findById(userId);
        user.setNickname(nickname);
        userService.update(user);
        return BaseResult.ok();
    }

    /**
     * 修改用户性别
     *
     * @param userId
     * @param userSex
     * @return
     */
    @PostMapping("/updateUserSex")
    public BaseResult updateUserSex(Integer userId, String userSex) {
        User user = userService.findById(userId);
        user.setUserSex(userSex);
        userService.update(user);
        return BaseResult.ok();
    }

    @Value("${wechat.appId}")
    private String appId;

    @Value("${wechat.appSecret}")
    private String appSecret;

    /**
     * 微信小程序登录接口
     *
     * @param request
     * @return
     */
    @PostMapping("/loginWX1")
    public BaseResult login(@RequestBody Map<String, Object> request) {
        String code = (String) request.get("code");
        Map<String, Object> userInfoMap = (Map<String, Object>) request.get("userInfo");

        try {
            // 调用微信接口换取 openid 和 session_key
            String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId
                    + "&secret=" + appSecret
                    + "&js_code=" + code
                    + "&grant_type=authorization_code";
            HttpClient httpClient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = httpClient.execute(httpGet);
            String responseJson = EntityUtils.toString(response.getEntity());
            JSONObject jsonObject = JSONObject.parseObject(responseJson);

            /**
             * userInfo返回的相关信息
             * {
             *   "nickName": "张三",        // 昵称（用户可修改，可能含特殊符号）
             *   "avatarUrl": "https://xxx.jpg", // 头像URL（微信服务器存储，建议本地化）
             *   "gender": 1,              // 性别（0=未知，1=男，2=女）
             *   "language": "zh_CN",      // 语言（zh_CN/zh_TW/en）
             *   "city": "郑州",           // 城市（GPS定位或用户设置，可能为空）
             *   "province": "河南",       // 省份（同上）
             *   "country": "中国",        // 国家
             *   "unionId": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", // 微信开放平台统一ID（需绑定）
             *   "watermark": {            // 微信数据水印（防篡改）
             *     "appid": "wx5725196130899614", // 对应appId
             *     "timestamp": 1710432000 // 数据生成时间戳
             *   }
             */
            if (jsonObject.containsKey("openid")) {
                String openid = jsonObject.getString("openid");
                // 根据 openid 查找用户，如果不存在则创建新用户
                User user = new User();
                user.setUserImg((String) userInfoMap.get("avatarUrl"));//头像
                user.setNickname((String) userInfoMap.get("nickName"));//昵称
                user.setWechat(openid);//openid
                // 保存或更新用户信息
                user = userService.addOrUpdateUser(user);
                return BaseResult.ok(user);
            } else {
                return new BaseResult(400, "获取 openid 失败", null);
            }
        } catch (IOException e) {
            return new BaseResult(500, "服务器内部错误", null);
        }
    }
}
